/*******************************************************************************
 * Copyright (c) 2011 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.takaharabooks.mhp3rd;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import jp.co.nobot.libAdMaker.libAdMaker;

import com.admob.android.ads.AdView;

import android.content.Intent;
import android.app.Activity;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;  
import android.graphics.BitmapFactory;
import android.graphics.Canvas; 
import android.graphics.Color;
import android.graphics.Matrix;
// view
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.content.Context;
import android.widget.GridView;
import android.widget.BaseAdapter;
import android.widget.AdapterView.OnItemClickListener;
import android.view.LayoutInflater;
import android.widget.TextView;
// text
import android.text.TextPaint;


public class MonsterGrid extends Activity
{
	// 広告クラス
	private ConbinateAdView m_csAd;
    // DB
    private DB_WeakPointGallery m_dbWeakPoint = null;	
	// 表示するモンスター画像ＩＤ
	private int m_nMonsterID = -1;
	private String m_strMonsterName = "";
	private int m_nLand; // 元の画面の縦横
	
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.monster_grid);   

        // 広告表示
        m_csAd = new ConbinateAdView( (ProgressBar)findViewById(R.id.loading2) );
        m_csAd.InitAdMaker((libAdMaker)findViewById(R.id.admakerview2), this);
        m_csAd.InitAdMob((AdView) findViewById(R.id.ad2));

        // 引数を取得
    	Bundle extras = getIntent().getExtras();
    	if (extras!=null) {
    		m_nMonsterID = (Integer)extras.getSerializable("ID");
    		m_strMonsterName = (String)extras.getSerializable("NAME");
    		m_nLand = (Integer)extras.getSerializable("LAND");
    	}

    	// データベースを作成
    	if( null == m_dbWeakPoint ){
	        m_dbWeakPoint = new DB_WeakPointGallery(this); 
	        m_dbWeakPoint.InitDB();
	        m_dbWeakPoint.SetMonsterDB(m_nMonsterID);
    	}
    	
	}

    @Override
    public void onStart()
    {
    	// モンスター画像を表示
    	InitGrid();
    	
        super.onStart();
    }
    
    @Override
    public void onDestroy(){
    	if( null != m_dbWeakPoint ){
    		m_dbWeakPoint.CloseDB();    	
    	}
    	super.onDestroy();
    }

    /**
     * メニューを作成する
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        super.onCreateOptionsMenu(menu);

        // タイトルメニューの作成
        MenuItem csMenu1 = menu.add(Menu.NONE, Menu.FIRST, Menu.NONE, "タイトルへ");
        csMenu1.setIcon(android.R.drawable.ic_menu_revert);
        MenuItem csMenu2 = menu.add(Menu.NONE, Menu.FIRST+1, Menu.NONE, "フルスクリーン");
        csMenu2.setIcon(android.R.drawable.ic_menu_view);
        
        return true;
    }
   /**
     * メニューボタン押下時の処理
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem menu)
    {
        switch (menu.getItemId()) {
        case Menu.FIRST:
            //Activity終了
            finish();
            return true;
        case Menu.FIRST+1:
            //フルスクリーン処理
        	if(0 == (getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN)){
	        	getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
	        	menu.setTitle("通常の画面");
        	}else{
                //フルスクリーンなら元に戻す
	        	getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
	        	menu.setTitle("フルスクリーン");
        	}
            return true;
        default:
            break;
        }
        
        return super.onOptionsItemSelected(menu);
    }

    /*************************************
     * アイテムリストの初期化
     **************************************/
    public void InitGrid()
    {
        GridView gridview = (GridView) findViewById(R.id.gridview);
        gridview.setAdapter(new ImageAdapter(this));

        gridview.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            	if( !IsAllMonsterDisp() ){
	                //Toast.makeText(MonsterGrid.this, "" + position, Toast.LENGTH_SHORT).show();
	            	String strImgName = m_dbWeakPoint.GetMonsterImgName(position);
	            	int nIndex = m_nMonsterID-1;
	            	m_dbWeakPoint.UpdateMonsterImageForUser(nIndex, strImgName);
	            	Intent intent = new Intent();  
	                intent.putExtra("LAND", m_nLand);  
	            	setResult(m_dbWeakPoint.GetImageIDFromImageName(strImgName), intent);
	            	finish();
            	}
            }
        });
    }
    
    /*************************************
     * 全モンスター画像を表示するかどうかを判定
     **************************************/
    public boolean IsAllMonsterDisp(){
    	return ( 0 > m_nMonsterID );
    }

    public class ImageAdapter extends BaseAdapter {
        private Context mContext;

        public ImageAdapter(Context c) {
            mContext = c;
        }

        public int getCount() {
        	if(IsAllMonsterDisp()){
                return m_dbWeakPoint.GetMonsterNum();        		
        	}else{
        		return m_dbWeakPoint.GetMonsterNum()+1;
        	}
        }

        public Object getItem(int position) {
            return null;
        }

        public long getItemId(int position) {
            return 0;
        }

        // create a new ImageView for each item referenced by the Adapter
        public View getView(int position, View convertView, ViewGroup parent)
        {
        	String strImgName = "m_noimage";
        	Bitmap bmp = null;
        	if(m_dbWeakPoint.GetMonsterNum() > position){
        		strImgName = m_dbWeakPoint.GetMonsterImgName(position);
        	}else if(0 < m_strMonsterName.length()){
        		bmp = getBitmapForGallery();
        	}
            View OneView;
            ImageView imageView;
            TextView textView;
            
            if (convertView == null) {  // if it's not recycled, initialize some attributes
            	OneView = new ImageView(mContext);
                //imageView.setLayoutParams(new GridView.LayoutParams(130, 130));
                //imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                //imageView.setPadding(8, 8, 8, 8);
            } else {
            	OneView = (View) convertView;
            }

            LayoutInflater inflater=getLayoutInflater();
            OneView=inflater.inflate(R.layout.grid_monster_view, parent, false);
            imageView = (ImageView)OneView.findViewById(R.id.grid_monster);
            textView = (TextView)OneView.findViewById(R.id.grid_text);
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

            if(bmp == null){
                // モンスター画像セット
                //imageView.setImageResource(strImgName);
                // モンスター名セット
                textView.setText(DB_WeakPointGallery.m_stStrDefMonsterName[m_dbWeakPoint.GetMonsterID(position)-1]);
            	//imageView.setImageResource(strImgName);
	            //画像読込
            	//i.setImageBitmap( getBitmapForGallery(position) );
	            try{
	            	imageView.setTag(strImgName);
	                // AsyncTaskは１回しか実行できない為、毎回インスタンスを生成
	            	MonsterGridImageGetTask task = new MonsterGridImageGetTask(imageView, strImgName, mContext);
	                task.execute(getResources().getString(R.string.SD_DIR_PATH) + strImgName + ".jpg");
	            }
	            catch(Exception e){
	                //m_csProgbar.setVisibility(View.GONE);
	            }
            }else{
            	imageView.setImageBitmap(bmp);
            }
        
            return OneView;
        }

        /*************************************
         * ギャラリー用モンスター名（画像）の取得
         **************************************/
        public Bitmap getBitmapForGallery()
        {
        	Bitmap csBmp = Bitmap.createBitmap(130, 110, Config.ARGB_8888);
        	Canvas csCanvas = new Canvas(csBmp);

      		String strText = m_strMonsterName;
    		TextPaint paintText = new TextPaint();
            paintText.setTextSize(24);
            paintText.setColor(Color.argb(255, 80, 80, 255));
    		csCanvas.drawText(strText, 0, 3, 10, csBmp.getHeight()/3*1-10, paintText);
    		csCanvas.drawText(strText, 3, 6, 15, csBmp.getHeight()/3*2-10, paintText);
    		csCanvas.drawText(strText, 6, 9, 20, csBmp.getHeight()/3*3-10, paintText);
    		//canvas.drawBitmap(reflectionImage,0, height + reflectionGap, null);
        	
    		return csBmp;
        }        
    }
    
    /*************************************
     *************************************
     * ＳＤからよみこみ処理をするクラス
     **************************************
     **************************************/
    class MonsterGridImageGetTask extends ImageGetTask
    {
        public MonsterGridImageGetTask(ImageView _image, String strImageFName, Context context ) {
            //対象の項目を保持しておく
        	super(_image, strImageFName, context);
        }
     
       @Override
        protected void onPostExecute(Bitmap result) {
            // Tagが同じものか確認して、同じであれば画像を設定する
            // （Tagの設定をしないと別の行に画像が表示されてしまう）
            if(tag.equals(image.getTag())){
                if(result!=null){
                    //画像の設定
                	image.setImageBitmap(ResizeBitmap(result, 130, 110));
                }
                else{
                    //エラーの場合は×印を表示
                    //image.setImageDrawable(getResources().getDrawable(R.drawable.x));
                }
                //プログレスバーを隠し、取得した画像を表示
                image.setVisibility(View.VISIBLE);
            }
        }
    }    
}